1 module hip.windowing.platforms.x11lib.glx;
2 import hip.windowing.platforms.x11lib.x11;
3 
4 version(Android){}
5 else version(linux)
6     version = X11;
7 
8 version(X11):
9 
10 alias GLint = int;
11 alias GLubyte = ubyte;
12 alias GLXPixmap = XID;
13 alias GLXDrawable = XID;
14 /* GLX 1.3 and later */
15 struct __GLXcontextRec;
16 alias GLXContext = __GLXcontextRec*;
17 struct __GLXFBConfigRec;
18 alias GLXFBConfig = __GLXFBConfigRec*;
19 alias GLXFBConfigID = XID;
20 alias GLXContextID = XID;
21 alias GLXWindow = XID;
22 alias GLXPbuffer = XID;
23 
24 
25 enum GLX_USE_GL           = 1;
26 enum GLX_BUFFER_SIZE      = 2;
27 enum GLX_LEVEL            = 3;
28 enum GLX_RGBA             = 4;
29 enum GLX_DOUBLEBUFFER     = 5;
30 enum GLX_STEREO           = 6;
31 enum GLX_AUX_BUFFERS      = 7;
32 enum GLX_RED_SIZE         = 8;
33 enum GLX_GREEN_SIZE       = 9;
34 enum GLX_BLUE_SIZE        = 10;
35 enum GLX_ALPHA_SIZE       = 11;
36 enum GLX_DEPTH_SIZE       = 12;
37 enum GLX_STENCIL_SIZE     =	13;
38 enum GLX_ACCUM_RED_SIZE   =	14;
39 enum GLX_ACCUM_GREEN_SIZE =	15;
40 enum GLX_ACCUM_BLUE_SIZE  =	16;
41 enum GLX_ACCUM_ALPHA_SIZE =	17;
42 
43 enum GLX_SAMPLE_BUFFERS = 0x186a0; /*100000*/
44 enum GLX_SAMPLES        = 0x186a1; /*100001*/
45 
46 
47 /*
48  * GLX 1.3 and later:
49  */
50 enum GLX_CONFIG_CAVEAT		     = 0x20;
51 enum GLX_DONT_CARE			     = 0xFFFFFFFF;
52 enum GLX_X_VISUAL_TYPE		     = 0x22;
53 enum GLX_TRANSPARENT_TYPE		 = 0x23;
54 enum GLX_TRANSPARENT_INDEX_VALUE = 0x24;
55 enum GLX_TRANSPARENT_RED_VALUE	 = 0x25;
56 enum GLX_TRANSPARENT_GREEN_VALUE = 0x26;
57 enum GLX_TRANSPARENT_BLUE_VALUE	 = 0x27;
58 enum GLX_TRANSPARENT_ALPHA_VALUE = 0x28;
59 enum GLX_WINDOW_BIT			     = 0x00000001;
60 enum GLX_PIXMAP_BIT			     = 0x00000002;
61 enum GLX_PBUFFER_BIT		     = 0x00000004;
62 enum GLX_AUX_BUFFERS_BIT	     = 0x00000010;
63 enum GLX_FRONT_LEFT_BUFFER_BIT   = 0x00000001;
64 enum GLX_FRONT_RIGHT_BUFFER_BIT  = 0x00000002;
65 enum GLX_BACK_LEFT_BUFFER_BIT    = 0x00000004;
66 enum GLX_BACK_RIGHT_BUFFER_BIT   = 0x00000008;
67 enum GLX_DEPTH_BUFFER_BIT	     = 0x00000020;
68 enum GLX_STENCIL_BUFFER_BIT	     = 0x00000040;
69 enum GLX_ACCUM_BUFFER_BIT  	     = 0x00000080;
70 enum GLX_NONE			         = 0x8000;
71 enum GLX_SLOW_CONFIG		     = 0x8001;
72 enum GLX_TRUE_COLOR			     = 0x8002;
73 enum GLX_DIRECT_COLOR		     = 0x8003;
74 enum GLX_PSEUDO_COLOR		     = 0x8004;
75 enum GLX_STATIC_COLOR		     = 0x8005;
76 enum GLX_GRAY_SCALE			     = 0x8006;
77 enum GLX_STATIC_GRAY		     = 0x8007;
78 enum GLX_TRANSPARENT_RGB	     = 0x8008;
79 enum GLX_TRANSPARENT_INDEX	     = 0x8009;
80 enum GLX_VISUAL_ID			     = 0x800B;
81 enum GLX_SCREEN			         = 0x800C;
82 enum GLX_NON_CONFORMANT_CONFIG   = 0x800D;
83 enum GLX_DRAWABLE_TYPE		     = 0x8010;
84 enum GLX_RENDER_TYPE		     = 0x8011;
85 enum GLX_X_RENDERABLE		     = 0x8012;
86 enum GLX_FBCONFIG_ID		     = 0x8013;
87 enum GLX_RGBA_TYPE			     = 0x8014;
88 enum GLX_COLOR_INDEX_TYPE	     = 0x8015;
89 enum GLX_MAX_PBUFFER_WIDTH	     = 0x8016;
90 enum GLX_MAX_PBUFFER_HEIGHT	     = 0x8017;
91 enum GLX_MAX_PBUFFER_PIXELS	     = 0x8018;
92 enum GLX_PRESERVED_CONTENTS	     = 0x801B;
93 enum GLX_LARGEST_PBUFFER	     = 0x801C;
94 enum GLX_WIDTH			         = 0x801D;
95 enum GLX_HEIGHT			         = 0x801E;
96 enum GLX_EVENT_MASK			     = 0x801F;
97 enum GLX_DAMAGED			     = 0x8020;
98 enum GLX_SAVED			         = 0x8021;
99 enum GLX_WINDOW			         = 0x8022;
100 enum GLX_PBUFFER			     = 0x8023;
101 enum GLX_PBUFFER_HEIGHT          = 0x8040;
102 enum GLX_PBUFFER_WIDTH           = 0x8041;
103 enum GLX_RGBA_BIT			     = 0x00000001;
104 enum GLX_COLOR_INDEX_BIT	     = 0x00000002;
105 enum GLX_PBUFFER_CLOBBER_MASK    = 0x08000000;
106 
107 
108 enum GLX_CONTEXT_MAJOR_VERSION_ARB = 0x2091;
109 enum GLX_CONTEXT_MINOR_VERSION_ARB = 0x2092;
110 enum GLX_CONTEXT_FLAGS_ARB         = 0x2094;
111 enum GLX_CONTEXT_PROFILE_MASK_ARB  = 0x9126;
112 
113 enum GLX_CONTEXT_DEBUG_BIT_ARB                  = 0x0001;
114 enum GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB     = 0x000;
115 enum GLX_CONTEXT_CORE_PROFILE_BIT_ARB           = 0x00000001;
116 enum GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB  = 0x00000002;
117 	
118 alias glXCreateContextAttribsARBProc = extern(C) nothrow @nogc GLXContext function(Display*, GLXFBConfig, GLXContext, Bool, const(int)*);
119 alias glXSwapIntervalEXTProc = extern(C) nothrow @nogc void function(Display *dpy, GLXDrawable drawable, int interval);
120 alias glXSwapIntervalSGIProc = extern(C) nothrow @nogc int function(int interval);
121 alias glXSwapIntervalMESAProc = extern(C) nothrow @nogc int function(int interval);
122 
123 glXSwapIntervalEXTProc glXSwapIntervalEXT;
124 glXSwapIntervalMESAProc glXSwapIntervalMESA;
125 glXSwapIntervalSGIProc glXSwapIntervalSGI;
126 
127 ///https://www.khronos.org/opengl/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
128 nothrow @system @nogc
129 bool isExtensionSupported(const char *extList, const char *extension)
130 {
131     import core.stdc.string;
132     const(char)* start;
133     const(char)* where, terminator;
134   
135     /* Extension names should not have spaces. */
136     where = strchr(extension, ' ');
137     if (where || *extension == '\0')
138         return false;
139 
140     /* It takes a bit of care to be fool-proof about parsing the
141         OpenGL extensions string. Don't be fooled by sub-strings,
142         etc. */
143     for (start=extList;;) 
144     {
145         where = strstr(start, extension);
146 
147         if (!where)
148         break;
149 
150         terminator = where + strlen(extension);
151 
152         if ( where == start || *(where - 1) == ' ' )
153         if ( *terminator == ' ' || *terminator == '\0' )
154             return true;
155 
156         start = terminator;
157     }
158 
159     return false;
160 }